#pragma once

#include <map>
#include <string>

#include "Scene.h"

#define PARSER_BUFFER_LENGTH      256

#define MULTI_LINE_COMMENT_START  "/*"
#define MULTI_LINE_COMMENT_END    "*/"
#define SINGLE_LINE_COMMENT       "//"

namespace rt
{
	class SceneParser
	{
	public:
		SceneParser(){ mParsedScreenWidth = mParsedScreenHeight = 256; mParsedShowProgress = false; };
		~SceneParser(){};

		Scene * ParseFromFile(const char * filename);

		int GetParsedWidth() { return mParsedScreenWidth; }
		int GetParsedHeight() { return mParsedScreenHeight; }
		bool GetParsedShowProgressOption() { return mParsedShowProgress; }

	private:
		Scene * mScene;
		FILE * mFile;
		char mBuffer[PARSER_BUFFER_LENGTH];

		int mParsedScreenWidth;
		int mParsedScreenHeight;

		bool mParsedShowProgress;

		std::map<std::string, Material*> mMaterialMap;

		void ParseMultilineComment();

		void ParseGeneral();
		void ParseLight();
		void ParseMaterial();

		void ParseSphere();
		void ParsePlane();
		void ParseBox();
		void ParseBlob();
		void ParseAlgeb();
	};

}
